const {mongoose} = require('../mongoose/conectDB')
const bcrypt = require('bcryptjs')
const Schema = mongoose.Schema
const SALT_WORK_FACTOR = 10
const MAX_LOGIN_ATTEMPTS = 5
const LOCK_TIME = 2 * 60 * 60 * 1000

const userSchema = new Schema({
    userName: {
        unique: true,
        type: String
    },
   
    password: {
        type: String
    },
    email: {
        type: String
    },
    date: {
        type: String
    },
    Headimagelink: {
        type: String,
        default: 'http://p612demvl.bkt.clouddn.com/ES6.png'
    },
    collections: {
        type: Object,
        default: {}
    }, 
    lockUntil: Number,
    meta: {
        createdAt: {
            type: Date,
            default: Date.now()
        },
        updatedAt: {
            type: Date,
            default: Date.now()
        }
    }
})


// userSchema.virtual('isLocked').get(() => {
//     return !!(this.lockUntil && this.lockUntil > Date.now())
// })

userSchema.pre('save', function(next) {
    // console.log(this.isNew)
    if (this.isNew) {
        this.meta.createdAt = this.meta.updatedAt = Date.now()
    } else {
        this.meta.updatedAt = Date.now()
    }
    next()
})

// // 密码加密
userSchema.pre('save', function(next) {
    if (!this.isModified('password')) {
        return next()
    }

    bcrypt.genSalt(SALT_WORK_FACTOR, (err, salt) => {
        if (err) { 
            // console.log('加密错误', err)
            return next(err)
        }
        bcrypt.hash(this.password, salt, (err, hash) => {
            if (err) {
                // console.log('进入加密出错', err)
                return next ()
            }
            this.password = hash
            next()
        })
    })
})

// // 实现实例方法
userSchema.methods = {
    cpmparePassword(_password) {
        return new Promise((resolve, reject) => {
            bcrypt.compare(_password, this.password, (err, isMatch) => {
                if (!err) resolve(isMatch)
                else reject(err)
            })
        })
    }
// // 密码输入错误进行锁定
//     incLoginAttepts(user) {
//         return new Promise((resolve, reject) => {
//             if (this.lockUntil && this.lockUntil < Date.now()) {
//                 this.update({
//                     $set: {
//                         loginAttempts: 1
//                     },
//                     $unset: {
//                         lockUntil: 1
//                     }
//                 }, (err) => {
//                     if (!err) resolve(true)
//                     else reject(err)
//                 })
//             } else {
//                 let updates = {
//                     $inc: {
//                         loginAttempts: 1
//                     }
//                 }

//                 if (this.loginAttempts + 1 >= MAX_LOGIN_ATTEMPTS && !this.isLocked) {
//                     updates.$set = {
//                         lockUntil: Date.now() + LOCK_TIME
//                     }
//                 }
                
//                 this.update(updates, err => {
//                     if (!err) resolve(true)
//                     else reject(err)
//                 })
//             }
//         })
//     }
}
const User = mongoose.model('Users', userSchema)
exports.User = User